package com.yn.core.service;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.yn.xr.common.page.Page;
import com.yn.xr.common.page.PageResult;


/**
 * 
 * @description:业务处理基类接口     
 * @fileName:BaseService.java 
 * @createTime:2015年1月26日 上午11:22:01  
 * @author:肖震 
 * @version 1.0.0  
 *
 */
public interface BaseService<T, ID extends Serializable> extends java.io.Serializable{
	/**
	 * 
	 * description: 根据属性查找对象
	 * @param propertyName属性名
	 * @param value 属性值
	 * @return List<T>
	 * @author:肖震   
	 * @since  1.0.0
	 */	
	public List<T> findByProperty(String propertyName, Object value);

	/**
	 * 
	 * description: 根据实体查找对象
	 * @param entiey实体
	 * @return List<T>
	 * @author:肖震  
	 * @since  1.0.0
	 */	
	public List<T> findByEntity(T entiey);

	/**
	 * 
	 * description:获取记录总数 
	 * @return int
	 * @author:肖震  
	 * @since  1.0.0
	 */
	public int getCount();
	/**
	 * 
	 * description: 保存返回id
	 * @param entity
	 * @return Long
	 * @author:肖震   
	 * @since  1.0.0
	 */
	public Serializable saveBackId(T entity);
	/**
	 * 
	 * description: 保存实体
	 * @param entity 实体
	 * @author:肖震   
	 * @since  1.0.0
	 */
	public void save(T entity);
	/**
	 * 
	 * description: 保存或更新实体集合
	 * @param entities void
	 * @author:肖震   
	 * @since  1.0.0
	 */
	 public void saveOrUpdateAll(Collection<T> entities);
	/**
	 * 
	 * description:更新实体 
	 * @param entity void
	 * @author:肖震n   
	 * @since  1.0.0
	 */
	public void update(T entity);

	/**
	 * 
	 * description:  删除实体
	 * @param entityids 实体id集合
	 * @author:肖震   
	 * @since  1.0.0
	 */
	public void delete(Serializable... entityids);
	/**
	 * 
	 * description:批量删除
	 * @param entities void
	 * @author:肖震  
	 * @since  1.0.0
	 */
	public void deleteAll(Collection<T> entities);
	/**
	 * 
	 * description: 删除
	 * @param entity 实体
	 * @author:肖震   
	 * @since  1.0.0
	 */
	public void delete(T entity);

	/**
	 * 
	 * description: 查找实体
	 * @param entityId实体id
	 * @return T
	 * @author:肖震   
	 * @since  1.0.0
	 */
	public T findById(Serializable entityId);
	/**
	 * 
	 * description: 条件查找
	 * @param hql条件
	 * @return List<T>
	 * @author:肖震   
	 * @since  1.0.0
	 */
	public List<T> find(String hql);
	
	public List findForHql(String hql);
	/**
	 * 
	 * description: 获取分页数据
	 * @param firstindex 开始索引
	 * @param maxresult 每页显示记录数
	 * @param wherejpql where语句
	 * @param queryParams 查询参数
	 * @param orderby 排序序列
	 * @return Page<T>
	 * @author:肖震   
	 * @since  1.0.0
	 */
	
	public Page<T> page(final int firstindex, final int maxresult, final String wherejpql, final Object[] queryParams,
			final LinkedHashMap<String, String> orderby);
	/**
	 * 
	 * description: 
	 * @param firstindex
	 * @param maxresult
	 * @param wherejpql
	 * @param orderby
	 * @return Page<T>
	 * @author:肖震   
	 * @since  1.0.0
	 */
	public Page<T> page(final int firstindex, final int maxresult, final String wherejpql, 
			final LinkedHashMap<String, String> orderby);

	/**
	 * 
	 * description: 获取分页数据
	 * @param firstindex 开始索引
	 * @param maxresult 每页显示记录数
	 * @param wherejpql where语句
	 * @param queryParams 查询参数
	 * @return Page<T>
	 * @author:肖震   
	 * @since  1.0.0
	 */
	
	public Page<T> page(final int firstindex, final int maxresult, final String wherejpql, final Object[] queryParams);

	/**
	 * 
	 * description: 获取分页数据
	 * @param firstindex 开始索引
	 * @param maxresult 每页显示记录数
	 * @param orderby 排序序列
	 * @return Page<T>
	 * @author:肖震   
	 * @since  1.0.0
	 */
	
	public Page<T> page(final int firstindex, final int maxresult, final LinkedHashMap<String, String> orderby);

	/**
	 * 
	 * description: 获取分页数据
	 * @param firstindex 开始索引
	 * @param maxresult 每页显示记录数
	 * @return Page<T>
	 * @author:肖震   
	 * @since  1.0.0
	 */
	
	public Page<T> page(final int firstindex, final int maxresult);

	
	/**
	 * 
	 * description: 保存或更新
	 * @param entity 
	 * @author:肖震   
	 * @since  1.0.0
	 */
	public void saveOrUpdate(T entity);
	
	public Page<T> page(final int firstindex,final int maxresult,String hql);
	/**
	 * 
	 * @function:根据sql查询  
	 * @param sql
	 * @return 
	 * @return type List   
	 * @exception 
	 * @author:肖震   
	 * @since  1.0.0
	 */
	public List getSQLScrollData(String sql);
	
	 public List getSQLScrollData(final String sql, final Object[] params);
	
	/**
	 * 
	 * @function:根据sql分页查询，可以带参数
	 * @param firstindex
	 * @param maxresult
	 * @param sql
	 * @param paramValue
	 * @return PageResult<T>   
	 * @exception 
	 * @author:伍俊   
	 * @since  1.0.0
	 */
	/*public PageResult<T> getSQLScrollData(int firstindex, int maxresult, String sql,Object[] paramValue);*/

	public List<T> findPre(String hql, Object... paramValues);
	

	public List findForHqlPre(String hql, Object... paramValues);
	
	
	/**
	 * 
	 * @function:  
	 * @param preHql
	 * @param firstindex
	 * @param maxresult
	 * @param wherejpql
	 * @param orderby
	 * @return Page<T>   
	 * @exception 
	 * @author:zengjianjian   
	 * @since  1.0.0
	 */
	public Page<T> page(final String preHql,final int firstindex, final int maxresult, final String wherejpql, final Object[] queryParams,
			final LinkedHashMap<String, String> orderby);
}